#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

void test()
{
    int a = 10;//栈上，栈变量
    int b = 20;//栈上，栈变量
    int *pflag = &a;
    string s1("hello");
    string s2("world");

    int &ref = a;
    /* int &ref1 = 10;//error */
    //const左值引用即可以绑定到左值，也可以绑定到右值
    const int &ref1 = 10;//ok
    const int &ref2 = a;//ok

    //C++98的困境就是不能完成通过代码区分左值与右值？
    //C++11提出了新的概念，可以识别右值？叫做：右值引用
    int &&rref = 10;//ok,可以绑定到右值
    /* int &&rref2 = a;//error,不能绑定到左值 */
    rref = 20;

    //左值：可以进行取地址
    //右值：不可以进行取地址
    &a;//ok,左值
    &b;//ok,左值
    /* &(a + b);//error,右值 */
    &pflag;//ok,左值
    &*pflag;//ok，左值

    &s1;//ok, 左值
    &s2;//ok，左值
    /* &(s1 + s2);//error,右值 */
    &ref;//ok,左值

    &rref;//ok,左值
}

int &&func()
{
    return 10;//右值
}

int arr[10] = {1, 3, 5, 7};
int &func2(size_t idx)
{
    return arr[idx];
}

int main(int argc, char **argv)
{
    test();

    /* &func();//error,右值 */
    &func2(0);//ok,左值
    return 0;
}

